#include<bits/stdc++.h>
using namespace std;
 
// 边(start, to)权值weight
struct edge
{
    int start;
    int to;
    long long weight;
}edges[200100];

int f[200005];
int m,n,i,j,u,v,total;
long long result;
 
//并查集
int finds(int x)
{
    if(x==f[x])
        return x;

    f[x] = finds(f[x]);
    return f[x];
}
 
void Kruskal()
{
    for(i=1;i<=m;i++)
    {
        // 边的端点已在同一并查集中，则舍弃
        u=finds(edges[i].start);
        v=finds(edges[i].to);
        if(u==v)
            continue;
        
        // 否则，将边加入并查集中（只需将一个端点加入，便可使得边加入）
        f[u]=v;

        // 统计权重
        result+=edges[i].weight;

        // 达到n-1条边时，任务结束
        if(++total == n-1)
            break;
    }
}
 
bool cmp(edge e1,edge e2)
{
    return e1.weight < e2.weight;
}
 
int main()
{
    // n个节点、m条边
    cin >> n >> m;

    // 初始化并查集
    for(i=1;i<=n;i++)
        f[i]=i;

    // 输入每一条边
    for(i=1;i<=m;i++)
        cin >> edges[i].start >> edges[i].to >> edges[i].weight;

    // 将edges按照边的权重升序排列
    sort(edges+1,edges+m+1,cmp);

    Kruskal();
    if(total == n-1)
        cout << result << endl;
    else
        cout << "orz" << endl;

    return 0;
}